﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;

namespace QldtSdh.BLL
{
    class BizLopHocPhan_BangDiem_HocVien
    {
        /// <summary>
        /// Lấy danh sách học viên không nằm trong danh sách thi hiện tại
        /// nhưng phải thỏa mãn 1 trong 2 điều kiện
        /// 1. Chưa thi
        /// 2. Thi nhưng chưa qua (dưới 5)
        /// </summary>
        /// <param name="maLopHocPhan"></param>
        /// <returns></returns>
        public static List<HocVien> GetListConLai(string maLopHocPhan, string maDotThi)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var lopHocPhan = db.LopHocPhanDbSet.Where(e => e.MaLopHocPhanGUID == maLopHocPhan).FirstOrDefault();
                if (lopHocPhan != null)
                {
                    var dsHocVienTrongDotThi = db.LopHocPhan_BangDiemHocVienDbSet.Where(
                        e => e.LopHocPhan_BangDiem.MaDotThiGUID == maDotThi &&
                            e.LopHocPhan_BangDiem.MaLopHocPhanGUID == maLopHocPhan
                        ).Select(e => e.MaHocVien).ToList();

                    var dsHocVienKhongNamTrongDotThi = db.LopHocPhan_HocVienDbSet.Where(
                        e => e.MaLopHocPhanGUID == maLopHocPhan && !dsHocVienTrongDotThi.
                        Contains(e.MaHocVien)).Select(e => e.MaHocVien).ToList();
                    if (dsHocVienKhongNamTrongDotThi.Count > 0)
                    {
                        List<HocVien> listKetQua = new List<HocVien>();
                        foreach (var mhv in dsHocVienKhongNamTrongDotThi)
                        {
                            var kq = db.HocVien_KetQuaHocTapDbSet.Where(
                                e => e.MaHocVien == mhv && e.MaHocPhanGUID == lopHocPhan.MaHocPhanGUID)
                                .FirstOrDefault();
                            //Trường hợp học viên chưa thi hoặc kết quả dưới 5
                            if (kq == null || kq.DiemHe10 < 5)
                            {
                                var hocVien = db.HocVienDbSet.Where(e => e.MaHocVien == mhv).FirstOrDefault();
                                if (hocVien != null)
                                    listKetQua.Add(hocVien);
                            }
                        }
                        return listKetQua;
                    }
                    else
                        return null;
                }
                else
                    return null;
            }
        }

        /// <summary>
        /// Lấy danh sách học viên trong bảng điểm
        /// </summary>
        /// <param name="maDotThi"></param>
        /// <param name="maLopHocPhan"></param>
        /// <returns></returns>
        public static List<HocVien> GetListHocVien(string maDotThi, string maLopHocPhan)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ls = db.LopHocPhan_BangDiemHocVienDbSet.Where(e => e.LopHocPhan_BangDiem.MaDotThiGUID == maDotThi && e.LopHocPhan_BangDiem.MaLopHocPhanGUID == maLopHocPhan)
                   .OrderBy(e => e.MaHocVien).ToList();
                var lsHocVien = new List<HocVien>();
                foreach (var item in ls)
                {
                    var hocVien = db.HocVienDbSet.Where(e => e.MaHocVien == item.MaHocVien).FirstOrDefault();
                    if (hocVien != null)
                    {
                        hocVien._DiemThi = item.DiemThi;
                        lsHocVien.Add(hocVien);
                    }
                }
                //var lsHocVien = db.HocVienDbSet.Where(e => ls.Contains(t => t.MaHocVien== e.MaHocVien)).ToList();
                return lsHocVien;
            }
        }

        /// <summary>
        /// Thêm một học viên vào bảng điểm
        /// </summary>
        /// <param name="maHocVien"></param>
        /// <param name="maLopHocPhan"></param>
        /// <param name="maDotThi"></param>
        /// <returns></returns>
        public static CODE_RESULT_RETURN Add(string maHocVien, string maLopHocPhan, string maDotThi)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var bangDiem = db.LopHocPhan_BangDiemDbSet.Where(e => e.MaDotThiGUID == maDotThi && e.MaLopHocPhanGUID == maLopHocPhan).FirstOrDefault();
                if ((bangDiem == null) || (bangDiem.TrangThai != (int)TRANGTHAI_BANGDIEM.CHUANHAPDIEM))
                    return CODE_RESULT_RETURN.ThatBai;
                var bdhv = db.LopHocPhan_BangDiemHocVienDbSet.Where(e => e.MaHocVien == maHocVien && e.LopHocPhan_BangDiem.MaDotThiGUID == maDotThi && e.LopHocPhan_BangDiem.MaLopHocPhanGUID == maLopHocPhan)
                   .FirstOrDefault();
                if (bdhv != null)
                    return CODE_RESULT_RETURN.MaTrung;
                var lanTinhDiem = db.LopHocPhan_BangDiemHocVienDbSet.Where(e => e.MaHocVien == maHocVien && e.LopHocPhan_BangDiem.MaLopHocPhanGUID == maLopHocPhan).ToList();
                bdhv = new LopHocPhan_BangDiemHocVien();
                bdhv.MaGhiNhanDiemThiKetThucHocPhanGUID = Guid.NewGuid().ToString();
                bdhv.MaBangDiemGUID = bangDiem.MaBangDiemGUID;
                bdhv.MaHocVien = maHocVien;
                bdhv.LanTinhDiem = lanTinhDiem.Count + 1;
                db.LopHocPhan_BangDiemHocVienDbSet.Add(bdhv);
                db.SaveChanges();
                var nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<LopHocPhan_BangDiemHocVien>(nhatKy, null, bdhv.MaGhiNhanDiemThiKetThucHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_BẢNG_ĐIỂM, LOAITHAOTAC.Thêm);
                BizNhatKyHoatDong.Add<LopHocPhan_BangDiemHocVien>(nhatKy, bdhv);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        /// <summary>
        /// Xóa một học viên khỏi bảng điểm
        /// </summary>
        /// <param name="maHocVien"></param>
        /// <param name="maLopHocPhan"></param>
        /// <param name="maDotThi"></param>
        /// <returns></returns>
        public static CODE_RESULT_RETURN Delete(string maHocVien, string maLopHocPhan, string maDotThi)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var bangDiem = db.LopHocPhan_BangDiemDbSet.Where(e => e.MaDotThiGUID == maDotThi && e.MaLopHocPhanGUID == maLopHocPhan).FirstOrDefault();
                if ((bangDiem == null) || (bangDiem.TrangThai != (int)TRANGTHAI_BANGDIEM.CHUANHAPDIEM))
                    return CODE_RESULT_RETURN.ThatBai;
                var bdhv = db.LopHocPhan_BangDiemHocVienDbSet.Where(e => e.MaHocVien == maHocVien && e.LopHocPhan_BangDiem.MaDotThiGUID == maDotThi && e.LopHocPhan_BangDiem.MaLopHocPhanGUID == maLopHocPhan)
                   .FirstOrDefault();
                if (bdhv == null)
                    return CODE_RESULT_RETURN.ThatBai;
                db.LopHocPhan_BangDiemHocVienDbSet.Remove(bdhv);
                db.SaveChanges();
                var nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<LopHocPhan_BangDiemHocVien>(nhatKy, bdhv, bdhv.MaGhiNhanDiemThiKetThucHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_BẢNG_ĐIỂM, LOAITHAOTAC.Xóa);
                BizNhatKyHoatDong.Add<LopHocPhan_BangDiemHocVien>(nhatKy, null);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN UpdateDiemThi(string maHocVien, string maLopHocPhan, string maDotThi, decimal diemThi)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var bangDiem = db.LopHocPhan_BangDiemDbSet.Where(e => e.MaDotThiGUID == maDotThi && e.MaLopHocPhanGUID == maLopHocPhan).FirstOrDefault();
                if ((bangDiem == null) || (bangDiem.TrangThai == (int)TRANGTHAI_BANGDIEM.DAPHEDUYET))
                    return CODE_RESULT_RETURN.ThatBai;
                var bdhv = db.LopHocPhan_BangDiemHocVienDbSet.Where(e => e.MaHocVien == maHocVien && e.LopHocPhan_BangDiem.MaDotThiGUID == maDotThi && e.LopHocPhan_BangDiem.MaLopHocPhanGUID == maLopHocPhan)
                   .FirstOrDefault();
                if (bdhv == null)
                    return CODE_RESULT_RETURN.ThatBai;
                var nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<LopHocPhan_BangDiemHocVien>(nhatKy, bdhv, bdhv.MaGhiNhanDiemThiKetThucHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_BẢNG_ĐIỂM, LOAITHAOTAC.Chỉnh_sửa);
                //Cập nhật điểm thi
                bdhv.DiemThi = diemThi;
                //Sau khi cập nhật điểm thi thì lưu kết quà vào bảng kết quả học tập
                var lhp = db.LopHocPhanDbSet.Where(e => e.MaLopHocPhanGUID == maLopHocPhan).FirstOrDefault();
                if (lhp != null)
                {
                    string maHocPhan = lhp.MaHocPhanGUID;
                    var lhp_hv = db.LopHocPhan_HocVienDbSet.Where(e => e.MaHocVien == maHocVien && e.MaLopHocPhanGUID == maLopHocPhan).FirstOrDefault();
                    //Nếu là học phần thay thế thì lấy mã học phần thay thế để đưa vào
                    if (lhp_hv != null && lhp_hv.HocThayThe && !string.IsNullOrEmpty(lhp_hv.MaHocPhanGUID_ThayThe))
                        maHocPhan = lhp_hv.MaHocPhanGUID_ThayThe;
                    var kq = db.HocVien_KetQuaHocTapDbSet.Where(e => e.MaHocVien == maHocVien && e.MaHocPhanGUID == maHocPhan).FirstOrDefault();
                    var hp = db.HocPhanDbSet.Where(e => e.MaHocPhanGUID == maHocPhan).FirstOrDefault();
                    if (hp != null)
                    {
                        if (kq != null)
                        {
                            kq.LanThi = bdhv.LanTinhDiem;
                            if (lhp_hv != null)
                            {
                                if (lhp_hv.DiemQTHT.HasValue)
                                    kq.DiemQTHT = lhp_hv.DiemQTHT.Value;
                                else
                                    return CODE_RESULT_RETURN.ThatBai;
                                kq.LanHoc = lhp_hv.LanHoc;
                                kq.DiemThi = diemThi;
                                kq.DiemChu = "";
                                kq.DiemHe4 = 0;
                                kq.HeSoDiemQTHT = lhp.HocPhan.HeSoDiemQTHT;
                                kq.DiemHe10 = Math.Round((kq.DiemQTHT * kq.HeSoDiemQTHT + kq.DiemThi * (100 - kq.HeSoDiemQTHT)) / 100, 2);
                            }
                        }
                        else
                        {
                            kq = new HocVien_KetQuaHocTap();
                            kq.MaGhiNhanDiemThiKetThucHocPhanGUID = Guid.NewGuid().ToString();
                            kq.MaHocVien = maHocVien;
                            kq.MaHocPhanGUID = maHocPhan;
                            kq.LanThi = bdhv.LanTinhDiem;
                            if (lhp_hv != null)
                            {
                                if (lhp_hv.DiemQTHT.HasValue)
                                    kq.DiemQTHT = lhp_hv.DiemQTHT.Value;
                                else
                                    return CODE_RESULT_RETURN.ThatBai;
                                kq.LanHoc = lhp_hv.LanHoc;
                                kq.DiemThi = diemThi;
                                kq.HeSoDiemQTHT = lhp.HocPhan.HeSoDiemQTHT;
                                kq.DiemHe10 = Math.Round((kq.DiemQTHT * kq.HeSoDiemQTHT + kq.DiemThi * (100 - kq.HeSoDiemQTHT)) / 100, 2);
                                kq.DiemChu = "";
                                kq.DiemHe4 = 0;
                                db.HocVien_KetQuaHocTapDbSet.Add(kq);
                            }
                        }
                    }
                    else
                        return CODE_RESULT_RETURN.ThatBai;
                    db.SaveChanges();
                    BizNhatKyHoatDong.Add<LopHocPhan_BangDiemHocVien>(nhatKy, bdhv);
                    return CODE_RESULT_RETURN.ThanhCong;
                }
                return CODE_RESULT_RETURN.ThatBai;
            }
        }
    }
}
